//@version=5
indicator("Pattern Recognition with the Frechet Distance", overlay=false)

// Get user input
min = input.float(5, "Min Distance", 0)
src = input.source(close, "Source")

// Example patterns
v_top          = array.from(0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0)
v_bot          = array.from(9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,9)
cup            = array.from(6,3,2,1,1,1,2,3,6)
cup_inv        = array.from(1,4,5,6,6,6,5,4,1)
headShldrs     = array.from(1,2,3,3,3,4,5,6,6,5,4,3,3,3,2,1)
headShldrs_inv = array.from(6,5,4,4,4,3,2,1,1,2,3,4,4,4,5,6)
triangle_sym   = array.from(1,8,2,7,3,6,5,4)
triangle_asym  = array.from(1,3,5,8,6,4,2,5,7,6,4,3,6)

// Create your pattern
my_pattern = array.from(0)

// Get components
pattern = array.copy(v_bot) // <= put here your pattern
len     = array.size(pattern)
norm    = array.new_float(len)

// Normalise chart range to pattern range
hp = array.max(pattern)
lp = array.min(pattern)
hh = ta.highest(src, len)
ll = ta.lowest(src, len)
nf = (hh - ll) / (hp - lp)
for i=0 to len-1
    array.set(norm, i, src[len - i - 1] / nf)
nd = array.get(norm, 0) - array.get(pattern, 0)
for i=0 to len-1
    array.set(norm, i, array.get(norm, i) - nd)

// Compute Frechet Distance
fd = 0.0
for i=0 to len-1
    fd += math.pow(math.abs(array.get(norm, i) - array.get(pattern, i)), 2)
fd := math.sqrt(fd)

// Plot
plot(fd , "Frechet Distance", color.blue)
plot(min, "Minimum Distance", color.red)
bgcolor(fd <= min ? color.new(color.red, 50) : na, title="Pattern Detected")